package com.kexilo.core.common.config.application;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.servers.Server;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * OpenAPI文档配置
 * 
 * @author Kexilo
 */
@Configuration
public class OpenApiConfig {
    
    @Value("${kexilo.name:Kexilo权限管理系统}")
    private String applicationName;
    
    @Value("${kexilo.version:1.0.0}")
    private String applicationVersion;

    /**
     * 配置OpenAPI基本信息
     */
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title(applicationName + " API文档")
                        .version(applicationVersion)
                        .description("基于Spring Boot + Vue3的企业级权限管理系统API文档")
                        .contact(new Contact()
                                .name("Kexilo Team")
                                .email("admin@kexilo.com")
                                .url("https://kexilo.com"))
                        .license(new License()
                                .name("Apache 2.0")
                                .url("http://www.apache.org/licenses/LICENSE-2.0.html")))
                .servers(List.of(
                        new Server().url("http://localhost:8080/api").description("开发环境"),
                        new Server().url("https://api.kexilo.com").description("生产环境")))
                .components(new Components()
                        .addSecuritySchemes("bearerAuth", new SecurityScheme()
                                .type(SecurityScheme.Type.HTTP)
                                .scheme("bearer")
                                .bearerFormat("JWT")
                                .description("JWT认证token")))
                .addSecurityItem(new SecurityRequirement().addList("bearerAuth"));
    }

    /**
     * 认证授权模块API分组
     */
    @Bean
    public GroupedOpenApi authApi() {
        return GroupedOpenApi.builder()
                .group("01-认证授权")
                .displayName("认证授权模块")
                .pathsToMatch("/auth/**", "/login", "/logout", "/captcha/**")
                .build();
    }

    /**
     * 系统管理模块API分组
     */
    @Bean
    public GroupedOpenApi systemApi() {
        return GroupedOpenApi.builder()
                .group("02-系统管理")
                .displayName("系统管理模块")
                .pathsToMatch("/system/**")
                .build();
    }

    /**
     * 用户管理API分组
     */
    @Bean
    public GroupedOpenApi userApi() {
        return GroupedOpenApi.builder()
                .group("03-用户管理")
                .displayName("用户管理")
                .pathsToMatch("/system/user/**")
                .build();
    }

    /**
     * 角色管理API分组
     */
    @Bean
    public GroupedOpenApi roleApi() {
        return GroupedOpenApi.builder()
                .group("04-角色管理")
                .displayName("角色管理")
                .pathsToMatch("/system/role/**")
                .build();
    }

    /**
     * 菜单管理API分组
     */
    @Bean
    public GroupedOpenApi menuApi() {
        return GroupedOpenApi.builder()
                .group("05-菜单管理")
                .displayName("菜单管理")
                .pathsToMatch("/system/menu/**")
                .build();
    }

    /**
     * 部门管理API分组
     */
    @Bean
    public GroupedOpenApi deptApi() {
        return GroupedOpenApi.builder()
                .group("06-部门管理")
                .displayName("部门管理")
                .pathsToMatch("/system/dept/**")
                .build();
    }

    /**
     * 字典管理API分组
     */
    @Bean
    public GroupedOpenApi dictApi() {
        return GroupedOpenApi.builder()
                .group("07-字典管理")
                .displayName("字典管理")
                .pathsToMatch("/system/dict/**")
                .build();
    }

    /**
     * 参数配置API分组
     */
    @Bean
    public GroupedOpenApi configApi() {
        return GroupedOpenApi.builder()
                .group("08-参数配置")
                .displayName("参数配置")
                .pathsToMatch("/system/config/**")
                .build();
    }

    /**
     * 监控管理API分组
     */
    @Bean
    public GroupedOpenApi monitorApi() {
        return GroupedOpenApi.builder()
                .group("09-监控管理")
                .displayName("监控管理")
                .pathsToMatch("/monitor/**")
                .build();
    }

    /**
     * 操作日志API分组
     */
    @Bean
    public GroupedOpenApi operLogApi() {
        return GroupedOpenApi.builder()
                .group("10-操作日志")
                .displayName("操作日志")
                .pathsToMatch("/monitor/operlog/**")
                .build();
    }

    /**
     * 登录日志API分组
     */
    @Bean
    public GroupedOpenApi loginLogApi() {
        return GroupedOpenApi.builder()
                .group("11-登录日志")
                .displayName("登录日志")
                .pathsToMatch("/monitor/logininfor/**")
                .build();
    }

    /**
     * 工具类API分组
     */
    @Bean
    public GroupedOpenApi toolApi() {
        return GroupedOpenApi.builder()
                .group("12-工具接口")
                .displayName("工具接口")
                .pathsToMatch("/tool/**", "/common/**")
                .build();
    }

    /**
     * V1版本API分组（稳定版本）
     */
    @Bean
    public GroupedOpenApi v1Api() {
        return GroupedOpenApi.builder()
                .group("V1-版本接口")
                .displayName("V1版本接口（稳定版本）")
                .pathsToMatch("/api/v1/**")
                .build();
    }

    /**
     * V2版本API分组（开发版本）
     */
    @Bean
    public GroupedOpenApi v2Api() {
        return GroupedOpenApi.builder()
                .group("V2-版本接口")
                .displayName("V2版本接口（开发版本）")
                .pathsToMatch("/api/v2/**")
                .build();
    }

    /**
     * 所有版本API分组
     */
    @Bean
    public GroupedOpenApi allVersionsApi() {
        return GroupedOpenApi.builder()
                .group("00-所有版本")
                .displayName("所有版本接口")
                .pathsToMatch("/api/**")
                .build();
    }

    /**
     * 内部API分组（不对外暴露）
     */
    @Bean
    public GroupedOpenApi internalApi() {
        return GroupedOpenApi.builder()
                .group("99-内部接口")
                .displayName("内部接口")
                .pathsToMatch("/internal/**", "/actuator/**")
                .build();
    }
}
